﻿using System;
using System.Collections.Generic;
using System.Linq;
using Cesave.Domain.Core.Specification;
using Cesave.Domain.PermisosModule.Contracts.Distritos;
using Cesave.Domain.PermisosModule.Entities;
using Cesave.Infrastructure.CrossCutting.Logging;
using Cesave.Infrastructure.Data.Core;
using Cesave.Infrastructure.Data.PermisosModule.Context;

namespace Cesave.Infrastructure.Data.PermisosModule.Repositories
{
	/// <summary>
	/// 
	/// </summary>
	public class DistritoRepository
		: GenericRepositoryEx<Distrito>, IDistritoRepository
	{
		#region Constructor

		/// <summary>
		/// 
		/// </summary>
		/// <param name="context"></param>
		/// <param name="traceManager"></param>
		public DistritoRepository(IPermisosModuleContext context, ITraceManager traceManager)
			: base(context, traceManager)
		{
		}

		#endregion

		#region IDistritoRepository Members

		/// <summary>
		/// 
		/// </summary>
		/// <param name="distritosByEstadoSpecification"></param>
		/// <returns></returns>
		public IEnumerable<Distrito> FindDistritosByEstadoSpecification(DistritosByEstadoSpecification distritosByEstadoSpecification)
		{
			if (distritosByEstadoSpecification == null)
				throw new ArgumentNullException("distritosByEstadoSpecification");
			return GetFilteredElements(distritosByEstadoSpecification.SatisfiedBy(), distrito => distrito.Numero, true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="distritosByEstadoSpecification"></param>
		/// <param name="distritosByStatusSpecification"></param>
		/// <returns></returns>
		public IEnumerable<Distrito> FindDistritosByEstadoAndStatusSpecification(DistritosByEstadoSpecification distritosByEstadoSpecification, DistritosByStatusSpecification distritosByStatusSpecification)
		{
			if (distritosByEstadoSpecification == null)
				throw new ArgumentNullException("distritosByEstadoSpecification");
			if (distritosByStatusSpecification == null)
				throw new ArgumentNullException("distritosByStatusSpecification");
			Specification<Distrito> distritosSpecification = new TrueSpecification<Distrito>();
			distritosSpecification &= distritosByEstadoSpecification;
			distritosSpecification &= distritosByStatusSpecification;
			return GetFilteredElements(distritosSpecification.SatisfiedBy(), distrito => distrito.Numero, true);
		}

		/// <summary>
		/// 
		/// </summary>
		/// <param name="distritoByGuidSpecification"></param>
		/// <returns></returns>
		public Distrito FindDistritoByGuidSpecification(DistritoByGuidSpecification distritoByGuidSpecification)
		{
			if (distritoByGuidSpecification == null)
				throw new ArgumentNullException("distritoByGuidSpecification");
			return GetBySpec(distritoByGuidSpecification).FirstOrDefault();
		}

		#endregion
	}
}
